package hgz.stu.review.ruijie.enviroment;

import java.util.Collection;
import java.util.Map;

/**
 * 
 * Description: Function Description
 * Copyright: Copyright (c) 2017
 * Company: Ruijie Co., Ltd.
 * Create Time: 2018年8月8日
 * 
 * @author hgz
 */
public class Assert {

    private Assert() {
        
    }

    /**
     * 断言一个布尔表达式是否true,否,则抛出{@code IllegalStateException}
     * 
     * @param expression 布尔表达式
     * @param message 断言失败时异常信息
     * @throws IllegalStateException {@code expression} 是 {@code false}抛出异常
     */
    public static void state(boolean expression, String message) {
        if (!expression) {
            throw new IllegalStateException(message);
        }
    }

    /**
     * 
     * 断言布尔表达式expression是true,否则抛出 {@code IllegalArgumentException}
     * 
     * @param expression 布尔表达式
     * @param message false时的结果说明
     * @throws IllegalArgumentException expression是false时，抛出的异常
     */
    public static void isTrue(boolean expression, String message) {
        if (!expression) {
            throw new IllegalArgumentException(message);
        }
    }

    /**
     * 断言一个对象为null，否则抛出 {@code IllegalArgumentException}
     * 
     * @param object 被检测的对象
     * @param message 非null时的异常信息
     * @throws IllegalArgumentException 非null时抛出的异常
     */
    public static void isNull(Object object, String message) {
        if (object != null) {
            throw new IllegalArgumentException(message);
        }
    }

    /**
     * 断言一个对象不为 {@code null}，否则抛出异常 IllegalArgumentException
     * 
     * @param object 被检测的对象
     * @param message 对象为 {@code null}时的异常信息
     * @throws IllegalArgumentException 对象为 {@code null}时的异常
     */
    public static void notNull(Object object, String message) {
        if (object == null) {
            throw new IllegalArgumentException(message);
        }
    }


    /**
     * 断言text.length()>0,否則抛出 IllegalArgumentException异常
     * 
     * @param text 被检测的文本
     * @param message 信息
     * @throws IllegalArgumentException
     */
    public static void hasLength(String text, String message) {
        if (text == null || text.length() == 0) {
            throw new IllegalArgumentException(message);
        }
    }

    /**
     * 断言传入的字符串不为空，且至少包含一个非空白字符，否则抛出异常
     * 
     * @param text 被检查的字符串
     * @param message 为null或者空白窜时的异常信息
     * @throws IllegalArgumentException 为null或者空白窜时
     */
    public static void hasText(String text, String message) {
        if (!StringUtils.hasText(text)) {
            throw new IllegalArgumentException(message);
        }
    }

    /**
     * 断言textToSearch不包含substring，否则抛出异常 IllegalArgumentException
     * 
     * @param textToSearch 检索范围
     * @param substring 子窜
     * @param message 被包含时的异常信息
     * @throws IllegalArgumentException 包含子窜时抛出异常
     */
    public static void doesNotContain(String textToSearch, String substring, String message) {
        if (StringUtils.hasLength(textToSearch) && StringUtils.hasLength(substring)
                && textToSearch.contains(substring)) {
            throw new IllegalArgumentException(message);
        }
    }

    /**
     * 断言给出的数组至少包含一个元素，即array.length > 0，否则抛出异常
     * 
     * <pre>
     * 算法：
     *  array == null || array.length == 0 那么抛出异常
     * </pre>
     * 
     * @param array 数组
     * @param message 信息
     * @throws IllegalArgumentException
     */
    public static void notEmpty(Object[] array, String message) {
        if (array == null || array.length == 0) {
            throw new IllegalArgumentException(message);
        }
    }

    /**
     * 断言数组里面没有null的元素,否则抛出异常；
     * 特别说明，空数组不做检测
     * 
     * <pre>
     * 算法：
     *    1.如果array == null 直接返回
     *    2.迭代数组，只要有元素是null的,抛出异常
     * </pre>
     * 
     * @param array 被检测的数组
     * @param message 异常时的信息
     * @throws IllegalArgumentException 数组为null或包含空元素时,抛出异常
     */
    public static void noNullElements(Object[] array, String message) {

        // 1.如果array == null 直接返回
        if (null == array) {
            return;
        }

        // 2.迭代数组，只要有元素是null的，抛出异常
        for (Object element : array) {
            if (element == null) {
                throw new IllegalArgumentException(message);
            }
        }
    }

    /**
     * 断言集合collection有元素，
     * 即集合不为{@code null}且至少包含一个元素，
     * 否则，抛出异常IllegalArgumentException
     * 
     * @param collection 被检测的集合
     * @param message 异常时的信息
     * @throws IllegalArgumentException 集合为null或不包含任何元素时的异常
     */
    public static void notEmpty(Collection<?> collection, String message) {

        if (collection == null || collection.isEmpty()) {
            throw new IllegalArgumentException(message);
        }
    }

    /**
     * 断言map含有条目，即map不为{@code null}且至少含有一条目,否则抛出异常IllegalArgumentException
     * 
     * @param map 被检测的map
     * @param message 断言失败时的信息
     * @throws IllegalArgumentException map为{@code null}或无条目时的异常
     */
    public static void notEmpty(Map<?, ?> map, String message) {
        if (map == null || map.isEmpty()) {
            throw new IllegalArgumentException(message);
        }
    }

    /**
     * 断言superType是subType的超类，或是同一类型，否则抛出异常
     * 
     * @param superType 被参照的类型，不能为null
     * @param subType 被检测的子类型
     * @param message 信息提示
     * @throws IllegalArgumentException subType为null或者不是子类时或同类的异常
     */
    public static void isAssignable(Class<?> superType, Class<?> subType, String message) {
        notNull(superType, "被参照的类型(超类)不能为空");
        if (subType == null || !superType.isAssignableFrom(subType)) {
            throw new IllegalArgumentException(message);
        }
    }

    /**
     * 
     * @param num 断言num大于 0
     * @param message 信息
     * @throws IllegalArgumentException num < = 0  时抛出
     */
    public static void isGreaterThanZero(long num, String message) {

        if (num < 0 || num == 0) {
            throw new IllegalArgumentException(message);
        }
    }
    
    /**
     * 
     * @param num 断言num大于等于 0
     * @param message 信息
     * @throws IllegalArgumentException num < 0 时抛出
     */
    public static void isGreaterThanOrEqualToZero(long num, String message) {

        if (num < 0) {
            throw new IllegalArgumentException(message);
        }
    }
}
